const express = require('express')
const path = require('path')
const fs = require('fs')
const router = express.Router()
const expressJoi = require('@escook/express-joi')
const middleWare_jwtToken = require('../middle_ware/expressjwt/index.js')
const { addToBlacklist } = require('../middle_ware/redis/index.js')

const userHandle = require('../routerHandle/user_handle.js')
const userSchema = require('../schema/user_schema.js')

router.use(middleWare_jwtToken)

//登录
router.post('/login', expressJoi({body: userSchema.loginSchema}), userHandle.userLogin)

//文件上传
router.post('/file', userHandle.multer.single('file'), (req, res) => {
	
	// 上传的文件信息在req.file中
	if (!req.file) {
		return res.cc(400, '请选择文件');
	}
	// FormData中的其他字段在req.body中
	const otherData = req.body;
	
	console.log('req.file', req.file);

	return res.cc(204, '文件上传成功')
})

router.post('/bufferFile', (req, res) => {
	console.log('req.headers', req.headers);
	console.log('fileName', req.headers['x-filename'])
	console.log('fileName', decodeURIComponent(req.headers['x-filename']))
	const fileName = decodeURIComponent(req.headers['x-filename'])
	if(!fileName){
		return res.send(400)
	}
	const savePath = path.join(__dirname, '../uploads')
	const filePath = path.join(__dirname, '../uploads', fileName)
	if (!fs.existsSync(savePath)) {
		fs.mkdirSync(savePath, { recursive: true });
	}

	//chunks法
	
	const chunks = []
	req.on('data', (chunk) => {
		console.log('chunk', typeof chunk, chunk);
		chunks.push(chunk)
	})
	req.on('end', () => {
		// 将缓冲区合并为一个Buffer（相当于ArrayBuffer）
		const buffer = Buffer.concat(chunks)
		// 验证文件大小（限制10MB）
		if (buffer.length > 10 * 1024 * 1024) {
			return res.cc('文件过大，最大支持10MB')
		}
		fs.writeFile(filePath, buffer, (err) => {
			if(err){
				console.log('文件保存失败')
				return res.cc(500, '文件保存失败')
			}else{
				console.log('文件上传成功');
				return res.cc(204, '文件上传成功', {fileName})
			}
		})
	})
})

router.post('/fileDownLoad', (req, res) => {
	
	// console.log('req', req);
	
	const fileName = req.query.fileName
	if(!fileName){
		return res.cc(400)
	}
	//可以下载文件的文件夹
	const fileDir = path.join(__dirname, '../uploads')
	// 文件存储路径
	const filePath = path.join(__dirname, '../uploads', decodeURIComponent(fileName));
	console.log('filePath', filePath);
	
	const resolvedPath = path.resolve(fileDir, decodeURIComponent(fileName));
	// 检查解析后的路径是否在允许的目录内
	if (!resolvedPath.startsWith(fileDir)) {
	  return res.cc(403, '禁止访问');
	}
	
	//判断文件是否存在
	if(fs.existsSync(filePath)){
		//获取该文件状态
		const fileState = fs.statSync(filePath)
		if(fileState.isFile()){
			// const mimeTypes = {
			//   '.html': 'text/html',
			//   '.css': 'text/css',
			//   '.js': 'text/javascript',
			//   '.json': 'application/json',
			//   '.png': 'image/png',
			//   '.jpg': 'image/jpeg',
			//   '.jpeg': 'image/jpeg',
			//   '.gif': 'image/gif',
			//   '.svg': 'image/svg+xml',
			//   '.ico': 'image/x-icon',
			//   '.pdf': 'application/pdf',
			//   '.txt': 'text/plain',
			//   '.mp3': 'audio/mpeg',
			//   '.mp4': 'video/mp4'
			// };
			// const fileType = path.extname(decodeURIComponent(fileName))
			// const contentType = mimeTypes[fileType] || 'application/octet-stream';
			// const contentType = 'application/octet-stream'
			// res.setHeader('content-type', contentType)
			
			// 方法一: fs.readFile + res.send  适合小文件
			// fs.readFile(filePath, (err, fileData) => {
			// 	if(err){
			// 		console.log('文件读取失败');
			// 		return res.cc(500, '文件读取失败')
			// 	}
			// 	// res.cc(200, null, { data: fileData })
			// 	return res.send(fileData)
			// })
			
			// // 方法二: fs.createReadStream + res.send   适合大文件
			const fileStream = fs.createReadStream(filePath)
			fileStream.pipe(res).on('error', (err) => {
			    console.error('文件读取错误:', err);
			    return res.cc(500, '文件读取失败');
			});
			
			// // 方法三: res.sendFile
			// return res.sendFile(filePath)

		}else{
			return res.cc(404, '不是文件')
		}
	}else{
		// return res.cc(404)
		return res.cc(404)
	}
})

router.post('/logout',async (req, res) => {
	console.log('req.auth',req.auth);
	// 将jti加入黑名单，过期时间与令牌有效期一致
	await addToBlacklist(req.auth.jti, req.auth.exp - req.auth.iat + 10);
	res.send({status: 0, msg: '退出成功', data: req.auth})
})

module.exports = router